/**
 * Flag debug
 */
//var debug = 0;

/**
 * @class Ajax
 */
function Ajax(){
	/**
	 * @field
	 */
	var mainContainer = '.main';
	/**
	 * @field
	 */
	var bodyContainer = 'body';
	/**
	 * @field
	 */
	var loader = $('<img src="images/ajax-loader.gif" alt="loader ajax" id="ajax-loader" />');
	/**
	 * @field
	 */
	this.dialogId = '#dialog-message';
	
	/**
	 * Vengono usati nel caso di messaggi, al posto di una coda di due elementi
	 * @field
	 */
	var previousUrl = window.location.href;
	/**
	 * @field
	 */
	var prevoiusPreviousUrl = window.location.href;
	/**
	 * @field
	 */
	var that = this;
	/**
	 *  Pop up a tutto schermo che mostra il messaggio e reindirizza correttamente
	 *  se l'url e' definito
	 *  @param title
	 *  @param content
	 *  @param url
	 */
	this.messaggioPopup = function(title,content,url){
		
		$(that.dialogId).html(content);
		
		$(that.dialogId).dialog({
			title:title,
			modal: true,
			buttons: {
				Ok: function() {
					$( this ).dialog( "close" );
					
				}			
			},close : function() {
				
				if(url != undefined){
					that.doAjax(url);
				}else{
					/**
					 * Torna alla pagina che ha mandato l'eccezione
					 */
					that.doAjax(prevoiusPreviousUrl);
				}
				
			}
			
		});
		
	}
	/**
	 * Trasforma tutte le ancore della pagina
	 * @param domObj
	 */
	this.anchorTransform = function(domObj){
		$(domObj).find('a[ajax!="no"]').each(function(){
			
			var href = $(this).attr('href');
			if(href == undefined || href == null){
				return;
			}

			if((href.search(/#+/) == -1) && (href.search(/javascript:/i) == -1)){
					
				$(this).attr('href','javascript:ajax.doAjax("'+($(this).attr('href'))+'");');
				
			}
		});
	}
	
	/**
	 * Esegue tutte le chiamate ajax
	 * @param link
	 * @param values
	 */
	this.call = function(link,values){
		

		//Escludo Explorer
		if(!$.browser['msie']){
			//history.pushState({page:link},"",link);
		}
		
		
		/**
		 * 
		 */
		prevoiusPreviousUrl = previousUrl;
		previousUrl = link;
		
		/**
		 * Cambio sfondo
		 */
		$(mainContainer).empty();
		$(mainContainer).append(loader);
		
		if(window.console && window.debug){
			window.console.info('Ajax Url = ' +link);
		}
		
		//Uso un oggetto come array associativo
		//Flag!
		values['u'] = 'on';
		var url = window.decodeURIComponent(link);
		
		//Spezzetto l'url 
		//Richiesta get
		if(link.search(/\?/) != -1){
			link = link.split('?');
			var items = link[1].split('&');
			
			//
			for(var i in items){
				var value = items[i].split('=');
				values[value[0]] = value[1];
			}
			
			url = link[0];
		}
		
		$.ajax({
			  url: url,
			  type:'POST',
			  data:values,
			  success: that.gestisciRisposta,
			  error:that.gestioneErrore

		});
		
	}
	
	/**
	 * gestione degli errori
	 * @param jqXHR
	 * @param textStatus
	 * @param error
	 */
	this.gestioneErrore = function(jqXHR,textStatus,error){
		
		if(window.console && window.debug){
			window.console.error('Richiesta ajax fallita!');
		}
		
		window.messaggioPopup.display('Errore', 'Impossibile completare la richiesta ajax');
		
	}
	
	/**
	 * Trasforma determinati form, in modo che compiano una richiesta Ajax
	 * @param domObj
	 */
	this.formTransform = function(domObj){
		
		
		$(domObj).find('form[ajax!="no"]').each(function(){
			
			var url = $(this).attr('action');
			
			$(this).submit(function(event){
				
				var dati = {};
				
				if(window.console && window.debug){
					window.console.info('Analizzando il form ...');
				}
				
				$(this).find('input[name]').each(function(){
					
					var name = $(this).attr('name');
					var value = $(this).val();
					dati[name] = value;
					
				});
				
				$(this).find('textarea[name]').each(function(){
					
					var name = $(this).attr('name');
					var value = $(this).val();
					dati[name] = value;
					
				});
				
				that.doAjax(url,dati);
				
				/** Impedisce lo svolgimento dell'azione **/
				
				return false;
			});
			
		});
		
		
		
	}
	/**
	 * Gestisce la risposta della chiamata ajax, qualora sia stata eseguita
	 * con successo.
	 * @param html
	 * @param textResponse
	 */
	this.gestisciRisposta = function(html,textResponse) {
		
		
		if(html == ''){
			window.messaggioPopup.display('Errore','Impossibile caricare la pagina, controlla la tua linea!');
			return;
		}
		
		$(mainContainer).detach('#ajax-loader');
		/**
		 * Genero DOM
		 */
		var tempNode = $(html);
		/**
		 * La risposta potrebbe essere costituita da un messaggio di errore o di informazioni
		 */
		if(tempNode.attr('id') == 'messaggio_ok'){
			
			var link = tempNode.find('.link');
			var url = link.attr('href');
			link.parent().remove();
			
			that.messaggioPopup('Azione eseguita!',tempNode.html(),url);
			
			//Limito i messaggi di popup noiosi
			return;
		}
		
		
		if(tempNode.attr('id') == 'messaggio_errore'){
			
			var link = tempNode.find('.link');
			var url = link.attr('href');
			link.parent().remove();
			
			that.messaggioPopup('Errore!',tempNode.html(),url);
			
			return;
		}
		
		/**
		 * Altrimenti visualizzo correttamente la pagina
		 */
		
		$(mainContainer).empty();
		$(mainContainer).append(tempNode);
		that.activateAjax($(bodyContainer));
		
	}
	/**
	 * Attiva Ajax  
	 * @param domObj
	 */
	this.activateAjax = function(domObj) {
		that.anchorTransform(domObj);
		that.formTransform(domObj);
	}
	/**
	 * doAjax
	 * @param url
	 * @param values
	 */
	this.doAjax = function(url,values){
		if(values == undefined){
			values = {};
			//Per il momento solo nel caso di link o altro, non funziona con i form
			
		}
		
		this.call(url,values);
		
	}
	
	$(document).ready(function(){
		
		if(window.console && window.debug){
			window.console.info('Ajax attivato!')
		}
		
		/*window.onpopstate = function(event){
		}*/
		
		that.activateAjax(bodyContainer);
		
		
	 });
	
	
}

var ajax = new Ajax();


